package com.weixing.mall.provider.controller.sys;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.weixing.mall.base.enums.ResultCodeEnum;
import com.weixing.mall.base.wrapper.Result;
import com.weixing.mall.base.wrapper.ResultUtil;
import com.weixing.mall.core.annotation.NoNeedAccess;
import com.weixing.mall.core.annotation.NoRepeatSubmit;
import com.weixing.mall.core.support.BaseController;
import com.weixing.mall.provider.model.domain.Role;
import com.weixing.mall.provider.model.dto.sys.SysRoleDto;
import com.weixing.mall.provider.model.enums.sys.SysFlag;
import com.weixing.mall.provider.model.query.SysRoleQuery;
import com.weixing.mall.provider.model.vo.sys.SysRoleEditVo;
import com.weixing.mall.provider.model.vo.sys.SysRoleFormVo;
import com.weixing.mall.provider.model.vo.sys.SysRoleVo;
import com.weixing.mall.provider.service.IRoleService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理模块
 *
 * @author siashan
 * @since v1
 */
@RestController
@RequestMapping("role")
public class SysRoleController extends BaseController {


    //类初始化是调用的方法注解

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        //给这个controller配置接收list的长度1024，仅在这个controller有效
        binder.setAutoGrowCollectionLimit(1024);
    }

    @Autowired
    private IRoleService sysRoleService;

    /**
     * 分页加载角色列表
     *
     * @param sysRoleQuery  查询条件
     * @return 角色列表
     */
    @GetMapping("")
    public Result<IPage<SysRoleVo>> list(SysRoleQuery sysRoleQuery) {
        IPage<SysRoleVo> list = sysRoleService.selectOfPage(initMpPage(), sysRoleQuery);
        return ResultUtil.success(list);
    }

    /**
     * 全部角色列表
     *
     * @return 角色列表
     */
    @GetMapping("all")
    @NoNeedAccess
    @ApiOperation(value = "查询角色-查询所有角色")
    public Result<List<SysRoleVo>> all() {
        List<SysRoleVo> list = sysRoleService.selectSysAll();
        return ResultUtil.success(list);
    }

    /**
     * 保存角色
     * @param sysRoleDto  参数
     * @return 保存结果
     */
    @PostMapping("save")
    @NoRepeatSubmit
    public Result save(@Validated SysRoleDto sysRoleDto) {

        if (null == sysRoleDto.getId()) {
            String roleName = sysRoleDto.getRoleName();
            String roleCode = sysRoleDto.getRoleCode();
            Role sysRole = sysRoleService.selectByRoleName(roleName, sysRoleDto.getSysFlag());
            Role sysRole1 = sysRoleService.selectByRoleCode(roleCode, sysRoleDto.getSysFlag());
            if (null != sysRole || sysRole1 != null) {
                return ResultUtil.error("角色已存在");
            }

        }
        sysRoleService.save(sysRoleDto);
        return ResultUtil.success();
    }

    /**
     * 删除角色
     *
     * @param id  角色id
     * @return  删除结果
     */
    @PostMapping("del/{id}")
    public Result del(@PathVariable long id) {
        boolean checked = sysRoleService.checkRoleUsed(id);
        if (!checked) {
            return ResultUtil.success(ResultCodeEnum.CODE_10014001);
        }
        return sysRoleService.removeById(id) ? ResultUtil.success() : ResultUtil.error();
    }

    /**
     * 删除角色
     * @param id  角色id
     * @return  删除结果
     */
    @PostMapping("delc/{id}")
    public Result delc(@PathVariable long id) {
        sysRoleService.deleteById(id);
        return ResultUtil.success();
    }

    /**
     * 按id查询角色
     * @param id 角色id
     * @return  角色
     */
    @GetMapping("/{id}")
    public Result<SysRoleEditVo> getRole(@PathVariable long id) {
        SysRoleEditVo sysRoleEditVo = sysRoleService.selectSysRoleEditVoById(id);
        return ResultUtil.success(sysRoleEditVo);
    }

    /**
     * 按用户id查询角色List
     * @param userId  用户id
     * @return 角色列表
     */
    @GetMapping("getRoleListByUserId/{userId}")
    public Result<List<Role>> getRoleListByUserId(@PathVariable long userId) {
        List<Role> sysRoleList = sysRoleService.selectSysRoleByUserId(userId, SysFlag.SYS);
        return ResultUtil.success(sysRoleList);
    }

    /**
     * 查询角色-用于表单操作
     * @return 角色列表
     */
    @ApiOperation(value = "查询角色-用于表单操作")
    @GetMapping("/form")
    public Result role() {
        List<SysRoleFormVo> list = sysRoleService.selectSysRoleFormVoList(SysFlag.SYS);
        return ResultUtil.success(list);
    }

}
